In the primitive settings of early computing, the program complexity was so small that one person's mind could fully embrace the whole of a program's activity down to the least details. Now, the human faculties haven't evolved since, whereas the capacities of computers have increased at a sustained geometric progression. To benefit from the technological progress, ever more abstract conceptual tools and programming languages had to be developed and used.
Great as the progress made by the individual programmer may be, the level of complexity has been long exceeded beyond which no one can conceive the entirety of a program that would take full advantage of existing computers. It is therefore of utmost importance to develop methods of exchange, cooperation, accumulation, construction, so as to elaborate complex programs; such is the field of software engineering.
In mid-October 2001, IBM released a manifesto pointing out that the difficulty of managing today's computing systems goes well beyond the administration of individual software environments. The need to integrate several heterogeneous environments into corporate-wide computing systems, and to extend that beyond company boundaries into the Internet, introduces new levels of complexity. Computing systems' complexity appears to be approaching the limits of human capability, yet the march toward increased interconnectivity and integration rushes ahead unabated.
In the article “The Vision of Autonomic Computing” of Jeffrey O. Kephartand David M. Chess published by the IEEE Computer Society, January 2003, it is suggested to create systems managing themselves according to an administrator's goal. New components integrate as effortlessly as a new cell establishes itself in the biologic systems.
The essence of autonomic computing systems is self-management, the intent of which is to free system administrators from the details of system operation and maintenance and to provide users with a machine that runs at peak performance. Like their biological namesakes, autonomic systems will maintain and adjust their operation in the face of changing components, workloads, demands, and external conditions and in the face of hardware or software failures, both innocent and malicious.
The autonomic system might continually monitor its own use, and check for component upgrades. If it deems the advertised features of the upgrades worthwhile, the system will install them, reconfigure itself as necessary, and run a regression test to make sure all is well. When it detects errors, the system will revert to the older version while its automatic problem determination algorithms try to isolate the source of the error. The authors cite four aspects of self-management:
TABLE 1AutonomicConceptCurrent computingcomputingSelf-configurationCorporate dataMultiple Automatedcenters have vendorsconfiguration ofand platforms.components andInstalling, configuring,systems follows high-and integratinglevel policies. Rest ofsystems timesystem adjusts isconsuming and errorautomatically andprone.seamlessly.Self-optimizationSystems haveComponents andhundreds of manuallysystems continuallyset, nonlinear tuningseek opportunities toparameters, and theirimprove their ownnumber increasesperformance andwith each release.efficiency.Self-healingProblemSystem automaticallydetermination indetects, diagnoses,large, complexand repairs localizedsystems can take asoftware andteam of programmerhardware problems.weeks.Self-protectionDetection of andSystem automaticallyrecovery from attacksdefends againstand cascadingmalicious attacks orfailures is manual.cascading failures. Ituses early warning toanticipate andprevent system widefailures.
Multiple application scenarios found, e.g. in pervasive and ubiquitous computing, have one aspect in common: software will be confronted with continuously changing execution environments. To guarantee seamless service, protocols, infrastructure, and applications will have to be able to adapt to changes in. e.g., networks, system configuration, available resources, varying policies, etc. In other words, adaptation will have to be a key feature of any mobile software system.
The vision of automatic computing and the problem of getting rid of a-posteriori functional and structural requirements are solved by a method for automatically adapting a computer program product to an environment. A computer program usually comprises executable parts and data parts. The method for automatically adapting a computer program product to an environment comprises the steps of configuring the computer program product for the environment and executing the software in the environment, where effects of the execution are observed inside the program, i.e. the behavior itself, i.e. the executable parts, analyzing the inter-relation of the observed effects with the software, and modifying executable parts based on rules in order to reduce undesirable effects.
The target is reached inter alia by a computer program product automatically adapting to an environment, the computer program product comprising executable parts and data parts, the computer program product comprising configuration means for configuring the computer program product for the environment for executing the computer program product in the environment, where the computer program product comprises observation means for observing effects of the execution, i.e. the behavior of the executable parts, inference means for analyzing the inter-relation of the observed effects with the computer program product, and restructuring means for modifying executable parts based on rules in order to reduce undesirable effects.
And the target is reached by a method for manufacturing such an automatically adapting computer program product, the method comprising the steps of furnishing the executable part by integrating observation means for observing effects of the execution, i.e. the behavior, of the executable parts, furnishing the executable part by inference means for analyzing the inter-relation of the observed effects with the software, and furnishing the executable part by restructuring means for modifying executable parts based on rules in order to reduce undesirable effects.
In other words it is suggested to replace the usual static software design which is not well suited for e.g. pervasive and ubiquitous computing in an everyday changing environment with a design allowing evolving requirements by applying program transformation techniques, interpreters, abstract (virtual) machines, compiler techniques, intelligent agent technology, and higher order programming. The adaptation, modification, and restructuring of e.g. agents (individuals, autonomous services, i.e. independent software pieces) enables them to run within an environment of evolving (changing) requirements. Note that in this context the words configuration and adaptation as well as modification become synonym.